package com.xzmzhp.security;

import com.xzmzhp.constant.ReturnConstant;
import com.xzmzhp.utils.return_tool.ResponseUtil;
import com.xzmzhp.utils.return_tool.ReturnData;
import com.xzmzhp.utils.StringUtils;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Date;

/**
 * @author 王源(xm)
 * @Date: 2020年12月10日10:04:01
 * @Description: token操作工具类
 */
@Component
@Slf4j
public class TokenManager {

    /**
     * token有效时长
     */
    private static final long TOKEN_ECPIRATION = 24 * 60 * 60 * 1000L;

    /**
     * 编码秘钥
     */
    private static final String TOKEN_SIGNKEY = "123456";

    /**
     * 根据用户名生成token
     *
     * @param loginUser 用户名
     * @return token
     */
    public String createToken(LoginUser loginUser) {
        //根据用户id生成token
        return Jwts.builder().setSubject(loginUser.getUser().getStudentId())
                //设置token时长   System.currentTimeMillis()获取当前毫秒数
                .setExpiration(new Date(System.currentTimeMillis() + TOKEN_ECPIRATION))
                //根据秘钥加密
                .signWith(SignatureAlgorithm.HS512, TOKEN_SIGNKEY).compact();
    }

    /**
     * 根据token字符串得到用户信息
     *
     * @param token token字符串
     * @return 含有用户信息的字符串
     */
    public String getUserInfoFromToken(HttpServletResponse response, String token) {
        try{
            if (StringUtils.isNotEmpty(token)) {
                String token1 = token.replace("\"", "");
                //对token字符串进行解密
                return Jwts.parser().setSigningKey(TOKEN_SIGNKEY).parseClaimsJws(token1.trim())
                        //获取用户信息
                        .getBody().getSubject();
            }
        }catch (Exception e){
            e.printStackTrace();
            ResponseUtil.out(response, new ReturnData(ReturnConstant.TOKEN_OVERTIME,"token已过期，请重新登录"));
        }
        return null;
    }

    /**
     * 获取请求token
     *
     * @param request 请求
     * @return token
     */
    String getToken(HttpServletRequest request) {
        return request.getHeader("token");
    }

}
